import re

haystack = "Hello world"
needle = "ello"

mo = re.search(needle, haystack)
print(mo)

# Does not work on python 3.6:
assert isinstance(mo, re.Match)
assert mo.start() == 1
assert mo.end() == 5

assert re.escape("python.exe") == "python\\.exe"

p = re.compile("ab")
s = p.sub("x", "abcabca")
# print(s)
assert s == "xcxca"

idpattern = r"([_a-z][_a-z0-9]*)"

mo = re.search(idpattern, "7382 _boe0+2")
assert mo.group(0) == "_boe0"

# tes op range
assert re.compile("[a-z]").match("a").span() == (0, 1)
assert re.compile("[a-z]").fullmatch("z").span() == (0, 1)

# test op charset
assert re.compile("[_a-z0-9]*").match("_09az").group() == "_09az"

# test op bigcharset
assert re.compile("[你好a-z]*").match("a好z你?").group() == "a好z你"
assert re.compile("[你好a-z]+").search("1232321 a好z你 !!?").group() == "a好z你"

# test op repeat one
assert re.compile("a*").match("aaa").span() == (0, 3)
assert re.compile("abcd*").match("abcdddd").group() == "abcdddd"
assert re.compile("abcd*").match("abc").group() == "abc"
assert re.compile("abcd*e").match("abce").group() == "abce"
assert re.compile("abcd*e+").match("abcddeee").group() == "abcddeee"
assert re.compile("abcd+").match("abcddd").group() == "abcddd"

# test op mark
assert re.compile("(a)b").match("ab").group(0, 1) == ("ab", "a")
assert re.compile("a(b)(cd)").match("abcd").group(0, 1, 2) == ("abcd", "b", "cd")

# test op repeat
assert re.compile("(ab)+").match("abab")
assert re.compile("(a)(b)(cd)*").match("abcdcdcd").group(0, 1, 2, 3) == (
    "abcdcdcd",
    "a",
    "b",
    "cd",
)
assert re.compile("ab()+cd").match("abcd").group() == "abcd"
assert re.compile("(a)+").match("aaa").groups() == ("a",)
assert re.compile("(a+)").match("aaa").groups() == ("aaa",)

# test Match object method
assert re.compile("(a)(bc)").match("abc")[1] == "a"
assert re.compile("a(b)(?P<a>c)d").match("abcd").groupdict() == {"a": "c"}

# test op branch
assert re.compile(r"((?=\d|\.\d)(?P<int>\d*)|a)").match("123.2132").group() == "123"

assert re.sub(r"^\s*", "X", "test") == "Xtest"

assert re.match(r"\babc\b", "abc").group() == "abc"

urlpattern = re.compile("//([^/#?]*)(.*)", re.DOTALL)
url = "//www.example.org:80/foo/bar/baz.html"
assert urlpattern.match(url).group(1) == "www.example.org:80"

assert re.compile("(?:\w+(?:\s|/(?!>))*)*").match("a /bb />ccc").group() == "a /bb "
assert re.compile("(?:(1)?)*").match("111").group() == "111"
